package com.lagou.QuzManageSystem;

import com.lagou.model.Question;
import com.lagou.server.ServerDao;
import com.lagou.server.ServerInitClose;
import com.lagou.StuManageSystem.ServerStuCtrl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ServerQuzCtrl {

    /**
     * 声明一个List类型成员变量用于记录考题信息
     */
    private ArrayList<Question> list;

    /**
     * 使用合成复用原则
     */
    private ServerInitClose sic;
    private ServerDao sd;

    /**
     * 通过构造方法实现成员变量的初始化
     *
     * @param sic
     */
    public ServerQuzCtrl(ServerInitClose sic, ServerDao sd) {
        this.sic = sic;
        this.sd = sd;
    }

    /**
     * 自定义成员方法获取客户端发送的信息并实现对应功能
     */
    public void quzCtrl() throws IOException, ClassNotFoundException {

        //导入题库信息
        list = sd.loadQuestionData();
        //打印考题信息
        System.out.println("现有考题：");
        for(int i  = 0; i < list.size(); ++i){
            //打印题目
            System.out.println("\n" + list.get(i).getTitle());
            //打印选项
            for(int j = 0; j < list.get(i).getOption().length; ++j){
                System.out.print(list.get(i).getOption()[j] + "     ");
            }
        }
        System.out.println("");
        //获取客户端发送的信息进入相应功能，调用对应方法
        while (true) {
            String s = sic.getBr().readLine();
            if ("addQuz".equals(s)) {
                System.out.println("\n接收到添加考题的请求,请求信息为" + s);
                //声明ServerQuzCtrl的引用指向该类的对象
                ServerQuzCtrl sqc = new ServerQuzCtrl(sic,sd);
                //调用添加考题方法
                sqc.addQuz(list);
            } else if ("foundQuz".equals(s)) {
                System.out.println("\n接收到查找考题的请求,请求信息为" + s);
                //声明ServerQuzCtrl的引用指向该类的对象
                ServerQuzCtrl sqc = new ServerQuzCtrl(sic,sd);
                //调用查找考题方法
                sqc.foundQuz(list);
            } else if ("setQuz".equals(s)) {
                System.out.println("\n接收到修改考题的请求,请求信息为" + s);
                //声明ServerQuzCtrl的引用指向该类的对象
                ServerQuzCtrl sqc = new ServerQuzCtrl(sic,sd);
                //调用修改考题方法
                sqc.setQuz(list);
            } else if ("delQuz".equals(s)) {
                System.out.println("\n接收到删除考题的请求,请求信息为" + s);
                //声明ServerQuzCtrl的引用指向该类的对象
                ServerQuzCtrl sqc = new ServerQuzCtrl(sic,sd);
                //调用删除考题方法
                sqc.delQuz(list);
            } else if ("exit".equals(s)) {
                //保存题库到文件中
                sd.saveQuestionData(list);
                System.out.println("\n退出考题管理系统");
                return;
            }
        }

    }

    /**
     * 自定义成员方法实现服务器的添加考题功能
     *
     */
    public void addQuz(ArrayList<Question> list) throws IOException, ClassNotFoundException {
        //读取客户端发送的考题信息
        Question question = (Question) sic.getOis().readObject();
        for (int i = 0; i < list.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
            //调用get方法得到Question类型元素,再通过题目进行比较
            if (list.get(i).getTitle().equals(question.getTitle())) {
                //如果有相同信息，则返回fail并退出比较循环
                sic.getPs().println("fail");
                break;
            } else if ((i == list.size() - 1) && (!(list.get(i).getTitle().equals(question.getTitle())))) {
                //如果遍历到最后一位都没有相同的信息，则添加成功
                list.add(question);
                sic.getPs().println("success");
                break;
            }
        }
        //打印当前题库
        System.out.println("\n题库：");
        for(int i  = 0; i < list.size(); ++i){
            //打印题目
            System.out.println("\n" + list.get(i).getTitle());
            //打印选项
            for(int j = 0; j < list.get(i).getOption().length; ++j){
                System.out.print(list.get(i).getOption()[j] + "     ");
            }
        }
        System.out.println("");
    }


    /**
     * 自定义成员方法实现服务器的查找功能
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public void foundQuz(ArrayList<Question> list) throws IOException, ClassNotFoundException {
        //读取客户端发送的考题信息
        String title = sic.getBr().readLine();
        for (int i = 0; i < list.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
            //调用list的get方法得到Question类型元素，再通过考题进行比较
            if (list.get(i).getTitle().equals(title)) {
                //发送成功信息
                sic.getPs().println("success");
                //再通过对象输出流输出对象信息
                sic.getOos().writeObject(list.get(i));
                break;
            } else if ((i == list.size() - 1) && (!(list.get(i).getTitle().equals(title)))){
                //如果遍历到最后一位都没有相同的信息，则返回删除失败信息
                sic.getPs().println("fail");
            }
        }

    }

    /**
     * 自定义成员方法实现服务器的修改考题功能
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public void setQuz(ArrayList<Question> list) throws IOException, ClassNotFoundException {
        //读取客户端发送的考题信息
        String title = sic.getBr().readLine();
        for (int i = 0; i < list.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
            //调用list的get方法得到Question类型元素，再通过考题进行比较
            if (list.get(i).getTitle().equals(title)) {
                //发送成功信息
                sic.getPs().println("success");
                //获取修改后的考题对象
                Question question = (Question) sic.getOis().readObject();
                list.set(i,question);
                break;
            } else if ((i == list.size() - 1) && (!(list.get(i).getTitle().equals(title)))){
                //如果遍历到最后一位都没有相同的信息，则返回删除失败信息
                sic.getPs().println("fail");
            }
        }
        //打印当前题库
        System.out.println("\n题库：");
        for(int i  = 0; i < list.size(); ++i){
            //打印题目
            System.out.println("\n" + list.get(i).getTitle());
            //打印选项
            for(int j = 0; j < list.get(i).getOption().length; ++j){
                System.out.print(list.get(i).getOption()[j] + "     ");
            }
        }
    }


    /**
     * 自定义成员方法实现服务器的删除学员功能
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public void delQuz(ArrayList<Question> list) throws IOException, ClassNotFoundException {
        //读取客户端发送的考题信息
        String title = sic.getBr().readLine();
        for (int i = 0; i < list.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
            //调用list的get方法得到Question类型元素，再通过考题进行比较
            if (list.get(i).getTitle().equals(title)) {
                //删除集合中对应考题
                list.remove(i);
                //发送成功信息
                sic.getPs().println("success");
                //再通过对象输出流输出对象信息
                break;
            } else if ((i == list.size() - 1) && (!(list.get(i).getTitle().equals(title)))){
                //如果遍历到最后一位都没有相同的信息，则返回删除失败信息
                sic.getPs().println("fail");
            }
        }
        //打印当前题库
        System.out.println("\n题库：");
        for(int i  = 0; i < list.size(); ++i){
            //打印题目
            System.out.println("\n" + list.get(i).getTitle());
            //打印选项
            for(int j = 0; j < list.get(i).getOption().length; ++j){
                System.out.print(list.get(i).getOption()[j] + "     ");
            }
        }
    }
}
